/**
 * <p>Title: Operater.java</p>
 * <p>Description: 算子接口</p>
 * <p>Copyright: Copyright (c) 2018</p>
 *
 * @author ji'anyuan
 * @date 2018年3月10日
 * @version 1.0
 */
package org.mango.jiayin.operater.operater;

import java.util.Map;
import org.mango.jiayin.operater.domain.EventData;
import org.mango.jiayin.operater.exception.OperaterException;

/**
 * <p>
 * Title: Operater
 * </p>
 * <p>
 * Description: 算子接口
 * </p>
 *
 * @author ji'anyuan
 * @date 2018年3月10日
 */
public interface Operater {

  /**
   * <p>
   * Title: getName
   * </p>
   * <p>
   * Description: 获取算子的名称
   * </p>
   */
  String getName();

  /**
   * <p>
   * Title: calc
   * </p>
   * <p>
   * Description: 算子计算
   * </p>
   *
   * @param opParames 参数
   * @param data 数据
   * @param nestValues 嵌套数据
   */
  Object calc(String[] opParames, Object data, Map<String, Object> nestValues);


  /**
   * <p>
   * Title: getopParamesValues
   * </p>
   * <p>
   * Description: 获取参数值
   * </p>
   *
   * @param parames 参数
   * @param num 参数个数
   */
  static void checkParames(String[] parames, int num) {
    if (parames == null) {
      throw new OperaterException("the parames of split is empty");
    }

    if (parames.length < num) {
      throw new OperaterException("the parames length is short");
    }
  }

  /**
   * <p>
   * Title: getopParamesValues
   * </p>
   * <p>
   * Description: 获取参数值
   * </p>
   *
   * @param opParames 参数
   * @param data 数据
   * @param nestValues 嵌套数据
   * @return 参数值
   */
  static Object[] getopParamesValues(String[] opParames, Object data, Map<String, Object> nestValues) {
    if (data == null) {
      throw new OperaterException("the data is null");
    }

    Object[] values = new Object[opParames.length];
    for (int i = 0; i < opParames.length; i++) {
      if(opParames[i]==null){
        throw new OperaterException(String.format("the opParames index:[%d] is null", i));
      }
      Object value = ((EventData) data).getValueOrDefault(opParames[i],
          opParames[i].replace("\'", ""));
      if (nestValues != null && nestValues.containsKey(opParames[i])) {
        value = nestValues.getOrDefault(opParames[i], value);
      }
      if (value == null) {
        throw new OperaterException(String.format("the opParames index:[%d] value is null", i));
      }
      values[i] = value;
    }
    return values;
  }
}
